/**
 * @description Karma test configuration
 */

// Karma configuration
// Generated on Sat Jun 30 2018 21:53:53 GMT+0800 (中国标准时间)
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const path = require('path')

const resolve = function(dir) {
  return path.join(__dirname, './', dir)
}
module.exports = function(config) {
  config.set({
    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',

    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [{ pattern: 'test/**/*.spec.js' }],

    // list of files / patterns to exclude
    exclude: ['node_modules'],

    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
      'src/**/*.js': ['webpack', 'sourcemap'],
      'test/**/*.spec.js': ['webpack', 'sourcemap']
    },
    webpack: {
      mode: 'development',
      resolve: {
        extensions: ['.js'],
        alias: {
          '@': resolve('src'),
          '@components': resolve('src/components'),
          '@mock': resolve('mock'),
          '@common': resolve('src/components/common'),
          '@api': resolve('src/api'),
          '@store': resolve('src/store')
        }
      },
      resolveLoader: {
        moduleExtensions: ['-loader']
      },
      module: {
        rules: [
          {
            test: /\.js$/,
            loader: 'babel',
            options: {
              presets: ['es2015', 'stage-0', 'react'],
              plugins: ['istanbul']
            },
            include: [resolve('test'), resolve('src')]
          },
          {
            test: /\.css$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style',
              use: [{ loader: 'css', options: { sourceMap: true } }, 'postcss']
            })
          },
          {
            test: /\.less$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style',
              use: [
                { loader: 'css', options: { sourceMap: true } },
                {
                  loader: 'less',
                  options: { sourceMap: true, javascriptEnabled: true }
                }
              ]
            })
          },
          {
            test: /\.scss$/,
            use: ExtractTextPlugin.extract({
              fallback: 'style',
              use: [
                { loader: 'css', options: { sourceMap: true } },
                {
                  loader: 'sass',
                  options: { sourceMap: true, javascriptEnabled: true }
                }
              ]
            })
          }
        ]
      },
      devtool: 'source-map',
      plugins: [
        // Extract the CSS
        new ExtractTextPlugin('style.[chunkhash].css')
      ]
    },

    webpackServer: {
      noInfo: true // please don't spam the console when running in karma!
    },

    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress', 'coverage'],
    coverageReporter: {
      type: 'html',
      dir: 'coverage/'
    },
    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['Chrome'],
    plugins: [
      'karma-webpack',
      'karma-sourcemap-loader',
      'karma-coverage',
      'karma-jasmine',
      'karma-chrome-launcher'
    ],
    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
  })
}
